<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>
        Inheritance No.3 Native Inheritance
    </title>
</head>
<body>
    原型式继承
</body>
<script>
    // 3 原型式继承
    //来，上来先上主菜，原型式继承的关键，就是个函数
    function inheritObject(o){
        function F(){}  //声明个过渡函数 这句要是有问题我就没辙了
        F.prototype = o; //把过渡函数的原型 用对象赋值。注意参数o是个对象
        return new F(); //返回一个F的实例
    }
    //这玩意儿有毛用？？来来，接着看
    
    var father={
        name : '爸爸',
        age : 12,   //爸爸28岁
        sex : '男',
        body : ['172','70'],
        hand : {
            'wristPower' : 123,
            'handPower' : 123
        },
        eat : function(){
            console.log('吃饭');
            return this.name;
        }
    }

    //我去，爸爸类怎么变样了？请注意，他不再是一个Function了，所以他不可能是一个类了，只是一个对象，一个对象，一个对象
    var XiaoMing = inheritObject(father); //DaMing 通过inheriObject作为中间class，直接产生了一个以father对象为原型的类实例
    console.log(XiaoMing.eat()); //吃饭 爸爸  第一个是eat函数执行结果，第二个显示了返回值，没毛病

    //不过奇了怪了，不是继承么，怎么只有爸爸没有儿子？别急嘛，因为我写到这我也蒙蔽着呢。只能暂时这么理解，这个是用实例化的对象继承了原生对象
    // 强行要理解的话，就把father对象当成只有属性，没有prototype方法的父类，中间过度的F()作为Son，XiaoMing就是Son的实例了。
    // 当然你这son相当于本身什么属性方法都没有了，那么想到啥没有？类式继承的缺点一点不留的再次展现了。还记得啥缺点么？等我去copy下代码。

    var XiaoHong = inheritObject(father);

    /****************请注意，以下代码纯拷贝自demo5，连运行结果都没改，各位看官验证下是不是一样的**************************/

    /***************************下面是关于类式继承缺点的测试******************************************/
    //var XiaoHong = new Son();
    //先把小红小明打印出来看看
    console.log(XiaoHong);
    console.log(XiaoMing);

    XiaoHong.age = 18 //我要快快长大
    console.log(XiaoHong.age); //18
    console.log(XiaoMing.age); //28  

    XiaoHong.sex = '女' //人家是女孩子
    console.log(XiaoHong.sex); //女
    console.log(XiaoMing.sex); //男

    //强行加入一个数组，通过另一个实例push入数组
    console.log("-------数组对象操作修改法----------")
    console.log(XiaoMing.body); //[172,70]
    XiaoHong.body.push('C');
    console.log(XiaoMing.body);  //[172,70,C]
    XiaoHong.body.shift();
    console.log(XiaoMing.body);  //[70,C]

    //难道只有数组会影响？我们试试对象   
    console.log(XiaoMing.hand); //{wristPower : 123 ,handPower : 123}
    XiaoHong.hand.fingerPower = 12; //添加一个对象数据
    console.log(XiaoMing.hand);   //{wristPower : 123 ,handPower : 123, fingerPower :12}
    XiaoHong.hand.wristPower = 0;  //修改一个对象数据
    console.log(XiaoMing.hand);     //{wristPower : 0 ,handPower : 123, fingerPower :12}

    console.log("-------赋值修改法----------")
    // 那我赋值
    console.log(XiaoMing.body); //[70,C]
    XiaoHong.body=['60','B']; 
    console.log(XiaoHong.body); //[60,B]
    console.log(XiaoMing.body); //[70,C]

    console.log(XiaoMing.hand);    //{wristPower : 0 ,handPower : 123, fingerPower :12}
    XiaoHong.hand = {'wristPower' : 234 ,'handPower' : 234};
    console.log(XiaoHong.hand);   // {wristPower : 234 ,handPower : 234}
    console.log(XiaoMing.hand);    //{wristPower : 0 ,handPower : 123, fingerPower :12}

   /****************************验证完了？一样吧？行了，这就是原型式继承的全部内容了，请期待后续*************************************************/
</script>
</html>
  
